// function curry(fn: any, args: any[] = []) {
//   const length = fn.length;
//   return function (this: any, ...innerArgs: any[]) {
//     const subArgs = args.concat(innerArgs);
//     if (subArgs.length < length) {
//       return curry.call(this, fn, subArgs);
//     } else {
//       fn.apply(this, subArgs);
//     }
//   };
// }

function curry(fn: any, ...args: any[]): any {
  return fn.length <= args.length ? fn(...args) : curry.bind(null, fn, ...args);
}

function foo(a: any, b: any, c: any, d: any, e: any) {
  console.log("foo called", a, b, c, d, e);
}
const curried = curry(foo);
curried(1)!(2)!(3)!(4)!(5);

export {};
